\subsubsection{C++中的字节对齐}
. 基本概念
字节对齐：计算机存储系统中以Byte为单位存储数据，不同数据类型所占的空间不同，如：整型（int）数据占4个字节，字符型（char）数据占一个字节，短整型（short）数据占两个字节，等等。计算机为了快速的读写数据，默认情况下将数据存放在某个地址的起始位置，如：整型数据（int）默认存储在地址能被4整除的起始位置，字符型数据（char）可以存放在任何地址位置（被1整除），短整型（short）数据存储在地址能被2整除的起始位置。这就是默认字节对齐方式。

\textbf {举例说明}

很显然默认对齐方式会浪费很多空间，例如如下结构：
\begin{cpp}
    struct student
        {
            char name[5];
            int num;
            short score;

        }
\end{cpp}
本来只用了11 bytes（5+4+2）的空间，但是由于int型默认4字节对齐，存放在地址能被4整除的起始位置，即：如果name[5]从0开始存放，它占5bytes，而num则从第8（偏移量）个字节开始存放。所以sizeof(student)=16。于是中间空出几个字节闲置着。但这样便于计算机快速读写数据，是一种以空间换取时间的方式。其数据对齐如下\figref{fig:byte_align1}：
\begin{figure}[H]
    \centering
    \includegraphics{align1.png}
    \label{fig:byte_align1}
\end{figure}

如果我们将结构体中变量的顺序改变为：
\begin{cpp}
    struct student
        {
            int num;
            char name[5];
            short score;
        }
\end{cpp}
则，num从0开始存放，而name从第4（偏移量）个字节开始存放，连续5个字节，score从第10（偏移量）开始存放，故sizeof(student)=12。其数据对齐如下\figref{fig:byte_align2}：
\begin{figure}[H]
    \centering
    \includegraphics{align2.pdf}
    \label{fig:byte_align2}
\end{figure}

\begin{cpp}
    struct student
        {
            int num;
            short score;
            char name[5];
        }
\end{cpp}
则，sizeof(student)=12。其数据对齐如下\figref{fig:byte:align3}：
\begin{figure}[H]
    \centering
    \includegraphics{align3.png}
    \label{fig:byte:align3}
\end{figure}
